home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / SourceCode / Random / GaussianTest.m < prev    next >
Encoding:
Text File  |  1992-12-19  |  2.8 KB  |  137 lines

  1. //
  2. // BinTest
  3. //
  4. // This program tests a random number generator by running it n times
  5. // with m bins for sorting over the interval [0, 1].
  6. //
  7.  
  8.  
  9. #import "Random.h"
  10. #import <math.h>
  11. #import <stdio.h>
  12. #import <stdlib.h>
  13.  
  14.  
  15. #define DEFAULT_N    1000
  16. #define DEFAULT_M    10
  17. #define RANGE        3.5
  18.  
  19. #define MAX_BAR        40
  20.  
  21.  
  22. int main(int argc, char *argv[])
  23. {
  24.     id        myRand;                // Random number generator.
  25.     int        n;                // Quantity of numbers to generate.
  26.     int        m;                // Number of bins in which to sort them.
  27.     int        max;                // Size of largest bin.
  28.     int        i;                // Generic loop variable.
  29.     int        j;                // Generic loop variable.
  30.     double    x;                // The random number.
  31.     int        slot;                // The sorted position of a number.
  32.     int        barsize;            // The length of a result bar.
  33.     int        *binneg;            // The bin array (dynamically allocated).
  34.     int        *binpos;            // The bin array (dynamically allocated).
  35.     int        which;
  36.     
  37.     myRand = [[Random alloc] init];
  38.     [myRand setGOrigin:1.5];
  39.     
  40.     switch(argc) {
  41.         case 2:
  42.         sscanf(argv[1], "%d", &n);
  43.         m = DEFAULT_M;
  44.         break;
  45.     case 3:
  46.         sscanf(argv[1], "%d", &n);
  47.         sscanf(argv[2], "%d", &m);
  48.         break;
  49.     default:
  50.         n = DEFAULT_N;
  51.         m = DEFAULT_M;
  52.         break;
  53.     }
  54.     
  55.     //
  56.     // Allocate and initialize slot array:
  57.     //
  58.     
  59.     binneg = (int *)malloc(m * sizeof(int));
  60.     binpos = (int *)malloc(m * sizeof(int));
  61.     for(i = 0; i < m; i++) {
  62.         binneg[i] = 0;
  63.     binpos[i] = 0;
  64.     }
  65.     
  66.     //
  67.     // Make n random numbers:
  68.     //
  69.         
  70.     for(i = 0; i < n; i++) {
  71.         do {
  72.         x = [myRand gaussian];
  73.     } while (x == 0.0);
  74.     
  75.     which = (x > 0);
  76.     slot = (int)floor(fabs(x) * m / RANGE);
  77.     if((slot >= 0) && (slot < m) && (x != 0.0)) {        // If it is in range,
  78.         switch(which) {                    //   count it.
  79.             case 0:
  80.             if((++binneg[slot]) > max) {
  81.             max = binneg[slot];
  82.             }
  83.             break;
  84.         case 1:
  85.             if((++binpos[slot]) > max) {
  86.             max = binpos[slot];
  87.             }
  88.             break;
  89.         default:
  90.             printf("Why is which = %d?\n", which);
  91.             break;
  92.         }
  93.     }
  94.     }
  95.     
  96.     //
  97.     // Print the results:
  98.     //
  99.     
  100.     for(i = m - 1; i >= 0; i--) {
  101.         printf("%+1.6f to %+1.6f: %6d:", -((i + 1) * (RANGE / m)),
  102.         -(i * (RANGE / m)), binneg[i]);
  103.     
  104.     barsize = (int)((double)binneg[i] / ((double)max / (double)MAX_BAR));
  105.     for(j = 0; j < barsize; j++)
  106.         printf("*");
  107.     printf("\n");
  108.     }
  109.     for(i = 0; i < m; i++) {
  110.         printf("%+1.6f to %+1.6f: %6d:", i * (RANGE / m), (i + 1) * (RANGE / m), binpos[i]);
  111.     
  112.     barsize = (int)((double)binpos[i] / ((double)max / (double)MAX_BAR));
  113.     for(j = 0; j < barsize; j++)
  114.         printf("*");
  115.     printf("\n");
  116.     }
  117.     
  118.     printf("Max = %d\n\n", max);
  119.     
  120.     //
  121.     // Clean up:
  122.     //
  123.     
  124.     free(binneg);
  125.     free(binpos);
  126.     
  127.     //
  128.     // Return to caller:
  129.     //
  130.     
  131.     return 0;
  132. }
  133.  
  134.  
  135. //
  136. // End of file.
  137. //